#include "AlgoritmoGradoFijo.h"

AlgoritmoGradoFijo::AlgoritmoGradoFijo(string unNombre, int unGrado){
	nombreOrigen = unNombre;
	grado = unGrado;
	cantResultados = 0;
}

void AlgoritmoGradoFijo::ejecutar(){
	vector<string> v;

	string id = buscarID( nombreOrigen );

	if ( id == "-1" ){
		cout << "No existe ninguna persona con el nombre " << nombreOrigen << "." << endl;
		cout << "Por favor verifique haberlo ingresado correctamente." << endl;
		return;
	}

	Persona * personaOrigen = new Persona( id, v, 0);

	idPersonasProcesadas.agregar( personaOrigen->getID() );
	colaPersonas.push( personaOrigen );

	while ( !colaPersonas.empty() ) {
		procesar( colaPersonas.front() );
		delete colaPersonas.front();
		colaPersonas.pop();
	}

	cout << "Cantidad de Resultados: " << cantResultados << endl;
}

void AlgoritmoGradoFijo::procesar(Persona * unaPersona){
	vector<string> v;

	if ( unaPersona->getGrado() == this->grado )
	{
				emitir( unaPersona );
				cantResultados++;
	}
	else
	{
		vector<string> * peliculas = unaPersona->getIdPeliculas();
		for( unsigned int i = 0; i < peliculas->size(); i++ ){
			if( !idPeliculasProcesadas.esta( peliculas->at(i) ) )
			{
				idPeliculasProcesadas.agregar( peliculas->at(i) );
				Pelicula * unaPelicula = new Pelicula( peliculas->at(i), v );
				vector<string> * personasPelicula = unaPelicula->getIdPersonas();

				for( unsigned int j = 0 ; j < personasPelicula->size() ; j++){
					if ( !idPersonasProcesadas.esta( personasPelicula->at(j) ) ){
						idPersonasProcesadas.agregar( personasPelicula->at(j) );
						Persona * otraPersona = new Persona( personasPelicula->at(j), v, unaPersona->getGrado() + 1 );
						colaPersonas.push( otraPersona );
					}
				}

				delete unaPelicula;

			}
		}
	}
}

void AlgoritmoGradoFijo::emitir(Persona * unaPersona){
	cout << unaPersona->getNombre() << endl;
}

/************************************/
//FALTA IMPLEMENTAR
string AlgoritmoGradoFijo::buscarID(string nombre){
	if (nombre == "Robert De Niro") return "1";
	if (nombre == "Cuba Gooding Jr.") return "2";
	if (nombre == "Al Pacino") return "3";
	if (nombre == "Jodie Foster") return "4";
	if (nombre == "Ed Harris") return "5";
	if (nombre == "Tom Cruise") return "6";
	if (nombre == "Marlon Brando") return "7";

	throw "NOMBRE NO ENCONTRADO";
}
/***********************************/
